package com.hunk.utils;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringHelper {
	
	/** 逻辑上物理上，验证字符串是否为空
	 * @param str
	 * @return
	 */
	public static boolean isNotEmpty(String str) {
		if (str != null && !"".equals(str.trim()))
			return true;
		return false;
	}
	
	/** 去除英文全角空格、中文全角空格，中文半角空格
	 * @param str
	 * @return
	 */
	public static String trim(String str) {
		return str.replaceAll("　　","").replaceAll("　 ","").replaceAll(" ", "").trim();
	}
	
	/** 数字格式化左边补0 01 001
	 * @param num
	 * 				被格式的数字
	 * @param length
	 * 				几位整数
	 * @return
	 */
	public static String numberFormatWithZeroBegin(int num, int length) {
		NumberFormat nf = NumberFormat.getInstance();
        //设置是否使用分组
        nf.setGroupingUsed(false);
        //设置最大整数位数
        nf.setMaximumIntegerDigits(length);
        //设置最小整数位数    
        nf.setMinimumIntegerDigits(length);
        return nf.format(num);
	}
	
	/**
	   * 查找语句中的动态参数并返回参数列表
	   * 
	   * @param str
	   * @return List
	   */
	  public static List<String> findAllDynamicParaNameList(String str){
		   return findAllSubStrInList(str, "\\$\\{((\\d*)|(\\w*))\\}", 1);
	  }

	  /**
	   * 找出所有动态参数的参数名
	   * @param str
	   * @return 返回一个包含所有参数名的set结果对象
	   */
	  public static Set<String> findAllDynamicParaNameSet(String str){
		   return findAllSubStrInSet(str, PARRERN, 1);
	  }
	  
	  /**
		 * 找出字符串中所有的符合正则表达式的子字符串(可能有重复数据)
		 * @param str 原字符串	
		 * @param regexp 正则表达式
		 * @param point 符合正则表达式的位置
		 * @return 包含所有子字符串的List
		 */
	  public static List<String> findAllSubStrInList(String str, String regexp,int point){
	    List<String> ls = new ArrayList<String>();
	    Pattern p = Pattern.compile(regexp);
	    Matcher m = p.matcher(str);
	    while(m.find()){
	    	ls.add(m.group(point));
	    }
	    return ls;
	  }
	  
	  /**
	   * 找出字符串中所有的符合正则表达式的子字符串(没有重复数据)
	   * @param str 原字符串	
	   * @param regexp 正则表达式
	   * @param point 符合正则表达式的位置
	   * @return 包含所有子字符串的set
	   */
	  public static Set<String> findAllSubStrInSet(String str, String regexp,int point){
	    Set<String> set = new HashSet<String>();
	    Pattern p = Pattern.compile(regexp);
	    Matcher m = p.matcher(str);
	    while(m.find()){
	      set.add(m.group(point));
	    }
	    return set;
	  }
	  
	  /**
	   * 替换 str 字符串中的"${xx}指定的参数
	   * @param str
	   * @param map 存放key和value的map对象
	   * @return
	   */
	  public static String replaceSQLDynamicPara(String str, Map<String,String> map){
	    String result = str;
	    if(map!=null){
	      for(String s : map.keySet()){
	        result = replaceSQLDynamicPara(result,s,map.get(s));
	      }
	    }
	    return result;
	  }
	  
	  /**
	   * 替换sql字符串中的"${xx}指定的参数
	   * @param sql
	   * @param key 指代xx	
	   * @param value 是xx的需要替换的值
	   * @return String
	   */
	  public static String replaceSQLDynamicPara(String sql,String key,String value){
//		   return sql.replaceAll("\\$\\{("+key+")\\}", "'"+value+"'");
		   return sql.replaceAll("\\*\\{("+key+")\\}", "'"+value+"'");
	  }
	  
	  /**
	   * 替换str字符串中的"${xx}指定的参数
	   * @param str
	   * @param key 指代xx	
	   * @param value 是xx的需要替换的值
	   * @return String
	   */
	  public static String replaceStrDynamicPara(String sql,String key,String value){
		   return sql.replaceAll("\\$\\{("+key+")\\}", value);
	  }	

	  
	  /**
	   * 判断是否有动态参数
	   * @param str
	   * @return boolean
	   */
	  public static boolean hasDynamicPara(String str){
		   Pattern p = Pattern.compile(PARRERN);
		   Matcher m = p.matcher(str);
		   return m.find();
	  }
	  
	  private final static String PARRERN = "\\*\\{((\\d*)|(\\w*))\\}";
}
